Using the bulk summarized GWPS data object, compute the WUI for each mulit-UTR gene in each perturbation. Additionally, compute average WUI for each perturbation and analyze for outliers.
Note that WUI can only be computed for detected genes. Targets with low cell recovery tend to recover fewer genes and will rely on higher expression genes. If these have a different WUI profile than lower expression genes, there could be a bias in the average WUI computed for the target. Currently, we do not attempt to model this.
library(magrittr)
library(tidyverse)
library(cowplot)
library(plotly)
library(ggbeeswarm)
library(SummarizedExperiment)
library(Matrix)
library(sparseMatrixStats)
library(clusterProfiler)
library(org.Hs.eg.db)
set.seed(20210818)
MIN_UMIS=1000
MIN_MEAN_UI=0.10
FILE_SE="data/se/kd6_essential_bulk_expressed.Rds"
FILE_OUT="tbl/kd6_essential_wui_filtered-noipa-ui10.xlsx"
DIR_IMG_OUT="img/kd6-essential-filtered-noipa-ui10-"
## KNOWN FACTORS
GENES_CPSF <- c("CPSF1", "CPSF2", "CPSF3", "CPSF4", "WDR33", "FIP1L1")
GENES_CF1 <- c("NUDT21", "CPSF6", "CPSF7")
GENES_CF2 <- c("PCF11", "CLP1")
GENES_CSTF <- c("CSTF1", "CSTF2", "CSTF2T", "CSTF3")
GENES_PAF <- c("PAF1", "CTR9", "RTF1")
GENES_NEF <- c("NXF1", "SRSF3", "SRSF7", "THOC5")
COLOR_MAP <- c("non-targeting"="grey",
"CPSF complex"="#8FD979",
"CFI complex"="purple",
"CFII complex"="#FFAA66",
"CSTF complex"="#F6CDA3",
"PAF complex"="steelblue",
"mRNA export factors"="magenta",
"other"="black")
compute_effective_count <- function (cts) {
pct <- (cts %*% Diagonal(ncol(cts), 1/colSums(cts)))
lpct <- pct
lpct@x <- log2(lpct@x)
2^(-colSums(pct*lpct))
}
se_tx_target <- readRDS(FILE_SE)
idx_ntp <- colnames(se_tx_target) %>%
str_detect("non-targeting")
idx_multi_raw <- which(rowData(se_tx_target)$utr_type_no_ipa == 'multi' & !rowData(se_tx_target)$is_ipa)
cts_tx_ntp <- assay(se_tx_target[idx_multi_raw, idx_ntp], 'counts')
M_gene_tx <- rowData(se_tx_target[idx_multi_raw,]) %>%
as_tibble %>%
dplyr::select(transcript_id, gene_id) %>%
deframe %>%
fac2sparse
cts_gene_ntp <- M_gene_tx %*% cts_tx_ntp
ui_tx_ntp <- as.matrix(cts_tx_ntp / (t(M_gene_tx) %*% cts_gene_ntp))
ncells_ntp <- se_tx_target$n_cells[idx_ntp]
mui_tx <- rowWeightedMeans(ui_tx_ntp, ncells_ntp, na.rm=TRUE)
mui_tx[is.na(mui_tx)] <- 0
idx_tx <- M_gene_tx[,mui_tx >= MIN_MEAN_UI] %>% {
idx_i <- rowSums(.) > 1;
idx_j <- colSums(.[idx_i,]) > 0;
.[idx_i, idx_j]
} %>% colnames
df_multi <- rowData(se_tx_target[idx_tx,]) %>% as_tibble %>%
mutate(ensembl_id=str_remove(gene_id, "\\.[0-9]+$")) %>%
group_by(ensembl_id) %>%
mutate(utr_rank_expr=rank(utr_rank),
utr_wt=(utr_rank_expr - 1)/(max(utr_rank_expr) - 1)) %>%
ungroup() %>%
dplyr::select(transcript_id, transcript_name, gene_id, gene_name, ensembl_id,
utr_rank, utr_rank_expr, utr_wt) %>%
arrange(gene_id, utr_rank)
## use ordered version
idx_tx <- df_multi$transcript_id
df_multi %>% distinct(ensembl_id) %>% nrow %>%
sprintf(fmt="Found %d multi-UTR genes.")
## [1] "Found 4780 multi-UTR genes."
df_multi %>% nrow %>%
sprintf(fmt="These consist of %d 3' UTR isoforms.")
## [1] "These consist of 11129 3' UTR isoforms."
wt_tx <- df_multi %>% dplyr::select(transcript_id, utr_wt) %>% deframe
M_gene_tx <- df_multi$ensembl_id %>% fac2sparse
cts_tx_target <- assay(se_tx_target[idx_tx,], "counts")
cts_gene_target <- M_gene_tx %*% cts_tx_target
ui_tx_target <- cts_tx_target / (t(M_gene_tx) %*% cts_gene_target)
#ui_tx_target[is.na(ui_tx_target)] <- 0
wui_gene_target <- M_gene_tx %*% Diagonal(length(wt_tx), wt_tx) %*% ui_tx_target
etx_target_multi <- cts_tx_target %>% compute_effective_count
df_targets <- colData(se_tx_target) %>% as_tibble %>%
mutate(mean_wui=colMeans(wui_gene_target[,sgID_AB], na.rm=TRUE),
etx_multi=etx_target_multi[sgID_AB],
n_genes_detected=colSums(!is.na(wui_gene_target[,sgID_AB]))) %>%
mutate(gene_set=case_when(
target_gene == "non-targeting" ~ "non-targeting",
target_gene %in% GENES_CPSF ~ "CPSF complex",
target_gene %in% GENES_CF1 ~ "CFI complex",
target_gene %in% GENES_CF2 ~ "CFII complex",
target_gene %in% GENES_CSTF ~ "CSTF complex",
target_gene %in% GENES_PAF ~ "PAF complex",
target_gene %in% GENES_NEF ~ "mRNA export factors",
TRUE ~ "other"
) %>% factor(levels=c("other", "non-targeting", "CPSF complex",
"CFI complex", "CFII complex", "CSTF complex",
"PAF complex", "mRNA export factors"))) %>%
mutate(is_known=!gene_set %in% c("non-targeting", "other"))
writexl::write_xlsx(df_targets, FILE_OUT)
g <- df_targets %>%
ggplot(aes(x="Perturbations", y=mean_wui)) +
geom_violin(fill='lightgrey', size=0.2, draw_quantiles=c(0.25, 0.50, 0.75)) +
geom_quasirandom(aes(color=gene_set, size=n_cells, text=target_gene), pch=16) +
scale_color_manual(values=COLOR_MAP) +
scale_size_continuous(range=c(0.05, 3)) +
scale_y_continuous(labels=scales::percent_format(accuracy=1)) +
theme_bw() +
labs(x=NULL, y="Mean WUI", color="Gene Set", size=NULL)
## Warning: Ignoring unknown aesthetics: text
ggplotly(g, tooltip=c("text", "y", "gene_set", "n_cells"))
g <- df_targets %>%
ggplot(aes(x=mean_wui, y=etx_multi, color=gene_set, text=target_gene)) +
geom_point(aes(size=n_cells), pch=16) +
geom_rug(size=0.1) +
scale_color_manual(values=COLOR_MAP) +
scale_size_continuous(range=c(0.05, 3)) +
theme_bw() +
theme(legend.position="none") +
labs(x="Mean Weighted Usage Index",
y="Effective Transcripts (Multi-UTR Genes)",
color="Gene Set")
ggplotly(g, tooltip=c("text", "gene_set", "x", "y", "n_cells"))
df_targets %>%
ggplot(aes(x=mean_wui, y=etx_multi, color=gene_set, text=target_gene)) +
geom_point(data=filter(df_targets, gene_set == 'other'), size=0.5) +
geom_point(data=filter(df_targets, gene_set == 'non-targeting'), size=0.5) +
geom_point(data=filter(df_targets, is_known), size=3) +
geom_rug(size=0.1) +
scale_color_manual(values=COLOR_MAP) +
scale_size_continuous(range=c(0.05, 3)) +
theme_bw() +
labs(x="Mean Weighted Usage Index",
y="Effective Transcripts (Multi-UTR Genes)",
color="Gene Set")
ggsave(str_c(DIR_IMG_OUT, "wui_etx_multi.pdf"), width=8, height=6, dpi=300)
awui_baseline <- df_targets %>%
filter(target_gene == 'non-targeting') %$%
weighted.mean(mean_wui, n_cells)
awui_targets <- df_targets %>%
filter(target_gene != 'non-targeting', n_cells >= 20) %>%
group_by(target_gene_id) %>%
summarize(mean_wui=weighted.mean(mean_wui, n_cells)) %>%
mutate(mwui_dev=mean_wui-awui_baseline) %>%
dplyr::select(target_gene_id, mwui_dev) %>% deframe %>% sort(decreasing=TRUE)
gseBP <- gseGO(awui_targets, ont="BP", OrgDb=org.Hs.eg.db, keyType="ENSEMBL", nPermSimple=1e4)
## preparing geneSet collections...
## GSEA analysis...
## Warning in fgseaMultilevel(...): For some pathways, in reality P-values are less
## than 1e-10. You can set the `eps` argument to zero for better estimation.
## leading edge analysis...
## done...
gseMF <- gseGO(awui_targets, ont="MF", OrgDb=org.Hs.eg.db, keyType="ENSEMBL", nPermSimple=1e4)
## preparing geneSet collections...
## GSEA analysis...
## leading edge analysis...
## done...
gseCC <- gseGO(awui_targets, ont="CC", OrgDb=org.Hs.eg.db, keyType="ENSEMBL", nPermSimple=1e4)
## preparing geneSet collections...
## GSEA analysis...
## leading edge analysis...
## done...
dotplot(gseBP, showCategory=200, split=".sign") +
facet_grid(.~.sign)
ridgeplot(gseBP, showCategory=200) +
labs(x = "Deviation from Baseline AWUI")
## Picking joint bandwidth of 0.00247
emapplot(enrichplot::pairwise_termsim(gseBP), showCategory=Inf)
df_genesets <- gseBP@result
for (i in seq(nrow(df_genesets))) {
gseaplot(gseBP, by='all', geneSetID=i, title=df_genesets[i, "Description"]) %>%
print()
}
dotplot(gseCC, showCategory=200, split=".sign") +
facet_grid(.~.sign)
ridgeplot(gseCC, showCategory=200) +
labs(x = "Deviation from Baseline AWUI")
## Picking joint bandwidth of 0.00167
emapplot(enrichplot::pairwise_termsim(gseCC), showCategory=Inf)
df_genesets <- gseCC@result
for (i in seq(nrow(df_genesets))) {
gseaplot(gseCC, by='all', geneSetID=i, title=df_genesets[i, "Description"]) %>%
print()
}
dotplot(gseMF, showCategory=200, split=".sign") +
facet_grid(.~.sign)
ridgeplot(gseMF, showCategory=200) +
labs(x = "Deviation from Baseline AWUI")
## Picking joint bandwidth of 0.00143
emapplot(enrichplot::pairwise_termsim(gseMF), showCategory=Inf)
df_genesets <- gseMF@result
for (i in seq(nrow(df_genesets))) {
gseaplot(gseMF, by='all', geneSetID=i, title=df_genesets[i, "Description"]) %>%
print()
}
WUI appears to be sufficient to capture the major transcript-level action we had seen previously with contrasting simply proximal and distal transcripts.
## R version 4.1.1 (2021-08-10)
## Platform: x86_64-apple-darwin13.4.0 (64-bit)
## Running under: macOS Big Sur 10.16
##
## Matrix products: default
## BLAS/LAPACK: /Users/mfansler/miniconda3/envs/bioc_3_14/lib/libopenblasp-r0.3.18.dylib
##
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
##
## attached base packages:
## [1] stats4 stats graphics grDevices utils datasets methods
## [8] base
##
## other attached packages:
## [1] org.Hs.eg.db_3.14.0 AnnotationDbi_1.56.1
## [3] clusterProfiler_4.2.0 sparseMatrixStats_1.6.0
## [5] Matrix_1.3-4 SummarizedExperiment_1.24.0
## [7] Biobase_2.54.0 GenomicRanges_1.46.0
## [9] GenomeInfoDb_1.30.0 IRanges_2.28.0
## [11] S4Vectors_0.32.0 BiocGenerics_0.40.0
## [13] MatrixGenerics_1.6.0 matrixStats_0.61.0
## [15] ggbeeswarm_0.6.0 plotly_4.10.0
## [17] cowplot_1.1.1 forcats_0.5.1
## [19] stringr_1.4.0 dplyr_1.0.8
## [21] purrr_0.3.4 readr_2.1.1
## [23] tidyr_1.1.4 tibble_3.1.7
## [25] ggplot2_3.3.5 tidyverse_1.3.1
## [27] magrittr_2.0.3
##
## loaded via a namespace (and not attached):
## [1] shadowtext_0.1.2 readxl_1.3.1 backports_1.4.0
## [4] fastmatch_1.1-3 systemfonts_1.0.3 plyr_1.8.7
## [7] igraph_1.2.9 lazyeval_0.2.2 splines_4.1.1
## [10] crosstalk_1.2.0 BiocParallel_1.28.0 digest_0.6.29
## [13] yulab.utils_0.0.5 htmltools_0.5.2 GOSemSim_2.20.0
## [16] viridis_0.6.2 GO.db_3.14.0 fansi_0.5.0
## [19] memoise_2.0.1 tzdb_0.2.0 Biostrings_2.62.0
## [22] graphlayouts_0.8.1 modelr_0.1.8 enrichplot_1.14.1
## [25] colorspace_2.0-2 blob_1.2.2 rvest_1.0.2
## [28] ggrepel_0.9.1 textshaping_0.3.6 haven_2.4.3
## [31] xfun_0.30 crayon_1.4.2 RCurl_1.98-1.5
## [34] jsonlite_1.7.2 scatterpie_0.1.8 ape_5.6-2
## [37] glue_1.6.2 polyclip_1.10-0 gtable_0.3.0
## [40] zlibbioc_1.40.0 XVector_0.34.0 DelayedArray_0.20.0
## [43] scales_1.1.1 DOSE_3.20.0 DBI_1.1.1
## [46] Rcpp_1.0.7 viridisLite_0.4.0 gridGraphics_0.5-1
## [49] tidytree_0.4.0 bit_4.0.4 htmlwidgets_1.5.4
## [52] httr_1.4.2 fgsea_1.20.0 RColorBrewer_1.1-2
## [55] ellipsis_0.3.2 pkgconfig_2.0.3 farver_2.1.0
## [58] sass_0.4.0 dbplyr_2.1.1 utf8_1.2.2
## [61] labeling_0.4.2 ggplotify_0.1.0 tidyselect_1.1.1
## [64] rlang_1.0.2 reshape2_1.4.4 munsell_0.5.0
## [67] cellranger_1.1.0 tools_4.1.1 cachem_1.0.6
## [70] downloader_0.4 cli_3.3.0 generics_0.1.1
## [73] RSQLite_2.2.8 ggridges_0.5.3 broom_0.8.0
## [76] evaluate_0.15 fastmap_1.1.0 ragg_1.2.1
## [79] yaml_2.2.1 ggtree_3.2.0 knitr_1.39
## [82] bit64_4.0.5 fs_1.5.2 tidygraph_1.2.1
## [85] KEGGREST_1.34.0 ggraph_2.0.6 nlme_3.1-153
## [88] aplot_0.1.7 DO.db_2.9 xml2_1.3.3
## [91] compiler_4.1.1 rstudioapi_0.13 beeswarm_0.4.0
## [94] png_0.1-7 reprex_2.0.1 treeio_1.18.0
## [97] tweenr_2.0.0 bslib_0.3.1 stringi_1.7.6
## [100] highr_0.9 lattice_0.20-45 vctrs_0.4.1
## [103] pillar_1.7.0 lifecycle_1.0.1 jquerylib_0.1.4
## [106] data.table_1.14.2 bitops_1.0-7 patchwork_1.1.1
## [109] qvalue_2.26.0 R6_2.5.1 gridExtra_2.3
## [112] writexl_1.4.0 vipor_0.4.5 MASS_7.3-54
## [115] assertthat_0.2.1 withr_2.4.3 GenomeInfoDbData_1.2.7
## [118] parallel_4.1.1 hms_1.1.1 grid_4.1.1
## [121] ggfun_0.0.7 rmarkdown_2.11 ggnewscale_0.4.7
## [124] ggforce_0.3.3 lubridate_1.8.0
## Conda Environment YAML
name: base
channels:
- conda-forge
- bioconda
- defaults
dependencies:
- anaconda-client=1.8.0=pyhd8ed1ab_0
- anaconda-project=0.10.2=pyhd8ed1ab_0
- attrs=21.2.0=pyhd8ed1ab_0
- awscli=1.25.79=py39h6e9494a_0
- backports=1.0=py_2
- backports.functools_lru_cache=1.6.4=pyhd8ed1ab_0
- backports.zoneinfo=0.2.1=py39h701faf5_5
- bagit=1.8.1=pyhd8ed1ab_0
- bagit-profile=1.3.1=pyhd8ed1ab_0
- bdbag=1.6.1=pyhd8ed1ab_0
- beautifulsoup4=4.9.3=pyhb0f4dca_0
- blinker=1.4=py_1
- boa=0.11.0=pyha770c72_3
- boolean.py=3.7=py_0
- boto3=1.24.78=pyhd8ed1ab_0
- botocore=1.27.78=pyhd8ed1ab_0
- brotlipy=0.7.0=py39h63b48b0_1004
- bzip2=1.0.8=h0d85af4_4
- c-ares=1.18.1=h0d85af4_0
- ca-certificates=2022.9.24=h033912b_0
- cairo=1.16.0=he43a7df_1008
- cctools=973.0.1=hd9211c8_2
- cctools_osx-64=973.0.1=h3e07e27_2
- certifi=2022.9.24=pyhd8ed1ab_0
- cffi=1.15.1=py39hae9ecf2_0
- chardet=5.0.0=py39h6e9494a_0
- charset-normalizer=2.0.0=pyhd8ed1ab_0
- click=8.1.3=py39h6e9494a_0
- clyent=1.2.2=py_1
- colorama=0.4.3=py_0
- commonmark=0.9.1=py_0
- conda=4.14.0=py39h6e9494a_0
- conda-build=3.21.9=py39h6e9494a_1
- conda-forge-pinning=2021.10.10.22.03.30=hd8ed1ab_0
- conda-libmamba-solver=22.6.0=pyhd8ed1ab_0
- conda-pack=0.6.0=pyhd3deb0d_0
- conda-package-handling=1.9.0=py39ha30fb19_0
- conda-smithy=3.17.2=pyhd8ed1ab_0
- conda-standalone=4.10.3=h694c41f_0
- conda-suggest=0.1.1=pyh9f0ad1d_0
- conda-suggest-conda-forge=2021.8.24=h694c41f_0
- conda-verify=3.1.1=py39h6e9494a_1004
- constructor=3.3.1=py39h6e9494a_0
- cryptography=37.0.4=py39h9c2a9ce_0
- curl=7.83.1=h372c54d_0
- dataclasses=0.8=pyhc8e2a94_3
- dbus=1.13.6=ha13b53f_2
- deprecated=1.2.12=pyh44b312d_0
- docutils=0.16=py39h6e9494a_3
- expat=2.4.1=he49afe7_0
- ffq=0.2.1=pyhdfd78af_0
- filelock=3.0.12=pyh9f0ad1d_0
- font-ttf-dejavu-sans-mono=2.37=hab24e00_0
- font-ttf-inconsolata=3.000=h77eed37_0
- font-ttf-source-code-pro=2.038=h77eed37_0
- font-ttf-ubuntu=0.83=hab24e00_0
- fontconfig=2.13.1=h10f422b_1005
- fonts-conda-ecosystem=1=0
- fonts-conda-forge=1=0
- freetype=2.10.4=h4cff582_1
- fribidi=1.0.10=hbcb3906_0
- frozendict=2.3.4=py39h701faf5_0
- future=0.18.2=py39h6e9494a_5
- gawk=5.1.0=h8a989fb_0
- gdk-pixbuf=2.42.6=h2e6141f_0
- gettext=0.19.8.1=hd1a6beb_1008
- giflib=5.2.1=hbcb3906_2
- git=2.33.0=pl5321h9a53687_2
- git-lfs=2.13.3=h694c41f_0
- gitdb=4.0.7=pyhd8ed1ab_0
- gitpython=3.1.18=pyhd8ed1ab_0
- glib=2.70.2=hcf210ce_0
- glib-tools=2.70.2=hcf210ce_0
- glob2=0.7=py_0
- globus-sdk=2.0.1=pyhd8ed1ab_0
- gmp=6.2.1=h2e338ed_0
- gnutls=3.6.13=h756fd2b_1
- graphite2=1.3.13=h2e338ed_1001
- harfbuzz=2.9.0=h159f659_0
- htop=3.2.1=h398481e_0
- htslib=1.15=hc057d7f_0
- hub=2.14.2=hc7d050b_0
- icu=68.1=h74dc148_0
- idna=3.1=pyhd3deb0d_0
- importlib-metadata=4.11.4=py39h6e9494a_0
- importlib_metadata=4.11.4=hd8ed1ab_0
- importlib_resources=5.4.0=pyhd8ed1ab_0
- inotify_simple=1.3.5=pyha770c72_3
- ipython_genutils=0.2.0=py_1
- isodate=0.6.0=py_1
- jbig=2.1=h0d85af4_2003
- jinja2=3.0.1=pyhd8ed1ab_0
- jmespath=0.10.0=pyh9f0ad1d_0
- joblib=1.0.1=pyhd8ed1ab_0
- jpeg=9d=hbcb3906_0
- json5=0.9.5=pyh9f0ad1d_0
- jsonschema=4.3.1=pyhd8ed1ab_0
- jupyter_core=4.11.1=py39h6e9494a_0
- krb5=1.19.3=hb49756b_0
- ld64=609=hd2e7500_2
- ld64_osx-64=609=h2487922_2
- ldid=2.1.2=h6a69015_3
- lerc=2.2.1=h046ec9c_0
- libarchive=3.5.2=h2b60450_0
- libcurl=7.83.1=h372c54d_0
- libcxx=14.0.6=hccf4f1f_0
- libdeflate=1.10=h0d85af4_0
- libedit=3.1.20191231=h0678c8f_2
- libev=4.33=haf1e3a3_1
- libffi=3.4.2=h0d85af4_5
- libglib=2.70.2=hf1fb8c0_0
- libiconv=1.16=haf1e3a3_0
- libidn2=2.3.2=h0d85af4_0
- liblief=0.11.5=he49afe7_0
- libllvm12=12.0.1=hd011deb_2
- libmamba=0.25.0=h3ac2a45_2
- libmambapy=0.25.0=py39h85aca11_2
- libnghttp2=1.47.0=h942079c_0
- libpng=1.6.37=h7cec526_2
- librsvg=2.50.7=hd2a7919_0
- libsolv=0.7.22=hd9580d2_0
- libssh2=1.10.0=h52ee1ee_0
- libtiff=4.3.0=h1167814_0
- libunistring=0.9.10=h0d85af4_0
- libwebp-base=1.2.1=h0d85af4_0
- libxml2=2.9.12=h93ec3fd_0
- libxslt=1.1.33=h5739fc3_2
- libzlib=1.2.11=h9173be1_1013
- license-expression=1.2=py_0
- lxml=4.8.0=py39h63b48b0_2
- lz4-c=1.9.3=he49afe7_1
- lzo=2.10=haf1e3a3_1000
- mamba=0.25.0=py39ha435c47_2
- markupsafe=2.1.1=py39h63b48b0_1
- msrest=0.6.21=pyh44b312d_0
- nbformat=5.1.3=pyhd8ed1ab_0
- ncurses=6.3=h96cf925_1
- nettle=3.6=hedd7734_0
- oauthlib=3.1.1=pyhd8ed1ab_0
- openssl=1.1.1q=hfe4f2af_0
- pango=1.48.9=ha05cd14_0
- patch=2.7.6=hbcf498f_1002
- pcre=8.45=he49afe7_0
- pcre2=10.37=ha16e1b2_0
- perl=5.32.1=0_h0d85af4_perl5
- pigz=2.6=h5dbffcc_0
- pip=21.2.4=pyhd8ed1ab_0
- pixman=0.40.0=hbcb3906_0
- pkginfo=1.7.1=pyhd8ed1ab_0
- prompt-toolkit=3.0.20=pyha770c72_0
- prompt_toolkit=3.0.20=hd8ed1ab_0
- psutil=5.9.2=py39ha30fb19_0
- py-lief=0.11.5=py39h9fcab8e_0
- pyasn1=0.4.8=py_0
- pybind11-abi=4=hd8ed1ab_3
- pycosat=0.6.3=py39h63b48b0_1010
- pycparser=2.20=pyh9f0ad1d_2
- pycrypto=2.6.1=py39h89e85a6_1006
- pygithub=1.53=py_0
- pygments=2.10.0=pyhd8ed1ab_0
- pyjwt=1.7.1=py_0
- pyopenssl=20.0.1=pyhd8ed1ab_0
- pyrsistent=0.18.1=py39h63b48b0_1
- pysocks=1.7.1=pyha2e5f31_6
- python=3.9.13=h57e37ff_0_cpython
- python-dateutil=2.8.2=pyhd8ed1ab_0
- python-libarchive-c=4.0=py39h6e9494a_1
- python-tzdata=2021.5=pyhd8ed1ab_0
- python_abi=3.9=2_cp39
- pytz=2021.1=pyhd8ed1ab_0
- pytz-deprecation-shim=0.1.0.post0=py39h6e9494a_2
- pyyaml=5.4.1=py39h701faf5_3
- readline=8.1.2=h3899abd_0
- reproc=14.2.3=h0d85af4_0
- reproc-cpp=14.2.3=he49afe7_0
- requests=2.28.1=pyhd8ed1ab_1
- requests-oauthlib=1.3.0=pyh9f0ad1d_0
- rich=10.16.1=pyhd8ed1ab_0
- ripgrep=13.0.0=h244e342_0
- rsa=4.7.2=pyh44b312d_0
- ruamel.yaml=0.17.21=py39h63b48b0_1
- ruamel.yaml.clib=0.2.6=py39h63b48b0_1
- ruamel_yaml=0.15.80=py39h701faf5_1007
- s3transfer=0.6.0=pyhd8ed1ab_0
- scrypt=0.8.18=py39h6a41abd_3
- setuptools=65.3.0=pyhd8ed1ab_1
- six=1.16.0=pyh6c4a22f_0
- smartmontools=7.2=h940c156_0
- smmap=3.0.5=pyh44b312d_0
- soupsieve=2.3.1=pyhd8ed1ab_0
- sqlite=3.38.5=hd9f0692_0
- tapi=1100.0.11=h9ce4665_0
- tk=8.6.12=h5dbffcc_0
- toolz=0.11.1=py_0
- tornado=6.2=py39h701faf5_0
- tqdm=4.62.2=pyhd8ed1ab_0
- traitlets=5.1.0=pyhd8ed1ab_0
- typing_extensions=3.10.0.0=pyha770c72_0
- tzdata=2021e=he74cb21_0
- tzlocal=4.2=py39h6e9494a_1
- urllib3=1.26.6=pyhd8ed1ab_0
- vsts-python-api=0.1.22=py_0
- watchgod=0.7=pyhd8ed1ab_0
- wcwidth=0.2.5=pyh9f0ad1d_2
- wget=1.20.3=h52ee1ee_1
- wheel=0.37.0=pyhd8ed1ab_1
- wrapt=1.14.1=py39h701faf5_0
- xz=5.2.5=haf1e3a3_1
- yaml=0.2.5=haf1e3a3_0
- yaml-cpp=0.7.0=hb486fe8_1
- zipp=3.5.0=pyhd8ed1ab_0
- zlib=1.2.11=h9173be1_1013
- zstd=1.5.0=h582d3a0_0
prefix: /Users/mfansler/miniconda3